home *** CD-ROM | disk | FTP | other *** search
- /*
- ** TESTDRV
- **
- ** Device Driver Test for MSCDEX compatible CD-ROM
- **
- ** FILE: request.c
- ** jyg
- **
- ** Proper C calls for requests
- **
- ** Naming convention:
- **
- ** W DvRq <Cmd> <Subcmd> W = returns a word
- ** DvRq = device request
- ** Cmd = command abbrev
- ** Subcmd = sub command abbrev
- ** e.g. WDvRqIoiRaddr - device request, ioctl input subcommand,
- ** Return address of device header,
- ** returns the status word
- **
- ** Why so ugly? Its an attempt at Hungarian
- **
- ** REQUIRES request.h
- ** HISTORY:
- ** 10/01/90 Final (v1.0) -by- JYG
- ** Revised 12/06/91 Siddhartha Roy
- */
-
- #ifdef TESTDRV
- #include"test.h"
- #endif
-
- #include"request.h"
-
- /*
- ** Lowlevel routines whic ultimately call the driver
- ** Called by the logical routines in tests.c
- ** While adding a routine here follow the convention here
- */
-
- WORD WDvRqInit(drv,endaddr,pBPB)
- Dev_List *drv;
- BYTE far *endaddr;
- BYTE far *pBPB;
- {
- Init_Hdr Init;
- register Init_Hdr *req = &Init;
- #ifdef TESTDRV
- extern WORD cwRequests;
- cwRequests++;
- #endif
-
- Init.rqh.len = sizeof(Init_Hdr);
- Init.rqh.unit = drv->sub_unit;
- Init.rqh.cmd = DVRQ_INIT;
- Init.rqh.status = 0;
-
- Init.units = 0;
- Init.devno = 0;
-
- send_req((ReadWriteL_Hdr far *) req, drv->dev_addr);
-
- endaddr = Init.endaddr;
- pBPB = Init.bpbarr;
-
- return (req->rqh.status);
- }
-
-
-
- WORD WDvRqIoiRaddr(drv,pAddr)
- Dev_List *drv;
- DWORD *pAddr;
- {
- Raddr_Rec Raddr;
- register Raddr_Rec *req=&Raddr;
- WORD wStatus;
-
- wStatus = ioctl(drv,(BYTE *)req,DVRQ_IOCTLI,IOI_ret_addr,
- sizeof(Raddr_Rec));
- *pAddr = Raddr.addr;
-
- return (wStatus);
- }
-
- WORD WDvRqIoiLocHead(drv,addrmode,drvhead)
- Dev_List *drv;
- BYTE addrmode;
- DWORD *drvhead;
- {
- LocHead_Rec LocHead;
- LocHead_Rec *req = &LocHead;
- WORD wStatus;
-
- LocHead.addrmode = addrmode;
-
- wStatus = ioctl(drv,(BYTE *)req,DVRQ_IOCTLI,IOI_loc_head,
- sizeof(LocHead_Rec));
- *drvhead = LocHead.drvhead;
- return (wStatus);
- }
-
-
- WORD WDvRqIoiSimple(drv,chCall)
- Dev_List *drv;
- BYTE chCall;
- {
- BYTE Simple;
- return ioctl(drv,&Simple,DVRQ_IOCTLI,chCall,sizeof(BYTE));
- }
- WORD WDvRqIooSimple(drv,chCall)
- Dev_List *drv;
- BYTE chCall;
- {
- BYTE Simple;
- return ioctl(drv,&Simple,DVRQ_IOCTLO,chCall,sizeof(BYTE));
- }
-
-
- WORD WDvRqIoiDevStat(drv,pParams)
- Dev_List *drv;
- DWORD *pParams;
- {
- DevStat_Rec DevStat;
- DevStat_Rec *req = &DevStat;
- WORD wStatus;
-
-
- wStatus = ioctl(drv,(BYTE *)req,DVRQ_IOCTLI,IOI_dev_status,
- sizeof(DevStat_Rec));
- *pParams = DevStat.params;
-
- return (wStatus);
- }
-
- WORD WDvRqIoiSectSize(drv,rdmode,wSize)
- Dev_List *drv;
- BYTE rdmode;
- WORD *wSize;
- {
- SectSize_Rec SectSize;
- SectSize_Rec *req = &SectSize;
- WORD wStatus;
-
-
- SectSize.rmode = rdmode;
- wStatus = ioctl(drv,(BYTE *)req,DVRQ_IOCTLI,IOI_ret_sectsize,
- sizeof(SectSize_Rec));
- *wSize = SectSize.sectsize;
- return (wStatus);
- }
-
- WORD WDvRqIoiVolSize(drv,wSize)
- Dev_List *drv;
- DWORD *wSize;
- {
- VolSize_Rec VolSize;
- VolSize_Rec *req = &VolSize;
- WORD wStatus;
-
- wStatus = ioctl(drv,(BYTE *)req,DVRQ_IOCTLI,IOI_ret_volsize,
- sizeof(VolSize_Rec));
- *wSize = VolSize.volsize;
-
- return (wStatus);
- }
-
- WORD WDvRqIoiMedChng(drv,pMbyte)
- Dev_List *drv;
- char *pMbyte;
- {
- MedChng_Rec MedChng;
- MedChng_Rec *req = &MedChng;
- WORD wStatus;
-
- wStatus = ioctl(drv,(BYTE *)req,DVRQ_IOCTLI,IOI_media_changed,
- sizeof(MedChng_Rec));
- *pMbyte = MedChng.medbyte;
-
- return (wStatus);
- }
-
-
- WORD WDvRqIoiTnoInfo(drv,tno,trackinf)
- Dev_List *drv;
- BYTE tno;
- TnoInfo_Rec *trackinf;
- {
- WORD wStatus;
-
- trackinf->tno = tno;
- wStatus = ioctl(drv,(BYTE *) trackinf,DVRQ_IOCTLI,IOI_audio_trk_inf,
- sizeof(TnoInfo_Rec));
-
- return wStatus;
- }
-
- WORD WDvRqIoiSubChInfo(drv,frameAddr,xfer,nosects)
- Dev_List *drv;
- DWORD frameAddr;
- BYTE _far *xfer;
- DWORD nosects;
- {
- SubChanInfo_Rec SubChanInfo;
- SubChanInfo_Rec *req = &SubChanInfo;
- WORD wStatus;
-
- SubChanInfo.start_tno = frameAddr;
- SubChanInfo.xfer = (BYTE far *) xfer;
- SubChanInfo.nsect = nosects;
-
- wStatus = ioctl(drv,(BYTE *)req,DVRQ_IOCTLI,IOI_audio_subinfo,
- sizeof(SubChanInfo_Rec));
-
- return (wStatus);
-
- }
-
- WORD WDvRqIooEject(drv)
- Dev_List *drv;
- {
- BYTE code;
- return ioctl(drv,&code,DVRQ_IOCTLO,IOO_eject_disc,sizeof(BYTE));
- }
-
- WORD WDvRqIooLockDoor(drv,fcn)
- Dev_List *drv;
- BYTE fcn;
- {
- LockDoor_Rec LockDoor;
- LockDoor_Rec *req = &LockDoor;
- LockDoor.fcn = fcn;
- return ioctl(drv,(BYTE *)req,DVRQ_IOCTLO,IOO_lock_door,sizeof(LockDoor));
- }
-
- WORD WDvRqIooReset(drv)
- Dev_List *drv;
- {
- BYTE reset;
- return ioctl(drv,&reset,DVRQ_IOCTLO,IOO_reset_drv,sizeof(BYTE));
- }
-
- WORD WDvRqIooDrvBytes(drv)
- Dev_List *drv;
- {
- BYTE DrvBytes;
- return ioctl(drv,&DrvBytes,DVRQ_IOCTLO,IOO_wr_drv_bytes,
- sizeof(BYTE));
- }
- WORD WDvRqIooCloseTray(drv)
- Dev_List *drv;
- {
- BYTE CloseTray;
- return ioctl(drv,&CloseTray,DVRQ_IOCTLO,IOO_close_tray,sizeof(BYTE));
- }
-
- WORD WDvRqReadWriteL(drv,cmd,xfer,start,num,addrmode,mode,ilsize,ilskip)
- Dev_List *drv;
- BYTE cmd;
- BYTE far *xfer;
- DWORD start;
- WORD num;
- BYTE addrmode;
- BYTE mode;
- BYTE ilsize;
- BYTE ilskip;
- {
- ReadWriteL_Hdr Read_Rec;
- register ReadWriteL_Hdr far *req = &Read_Rec;
- #ifdef TESTDRV
- extern WORD cwRequests;
- cwRequests++;
- #endif
-
- req->rqh.len = sizeof(ReadWriteL_Hdr);
- req->rqh.unit = drv->sub_unit;
- req->rqh.cmd = (BYTE) (cmd);
- req->rqh.status = 0;
-
- req->addrmd = addrmode;
- req->xfer = (BYTE far *) xfer;
- req->nsects = num;
- req->start = start;
- req->mode = mode;
- req->ilskip = ilskip;
- req->ilsize = ilsize;
-
- send_req((ReadWriteL_Hdr far *) req, drv->dev_addr);
- return (req->rqh.status);
- }
-
- /*
- ** Seek Request
- */
-
- WORD WDvRqSeek(drv,start,mode)
- Dev_List *drv;
- DWORD start;
- BYTE mode;
- {
- SeekReq_Hdr Seek_Rec;
- SeekReq_Hdr far *req = &Seek_Rec;
- #ifdef TESTDRV
- extern WORD cwRequests;
- cwRequests++;
- #endif
-
- req->rqh.len = sizeof(SeekReq_Hdr);
- req->rqh.unit = drv->sub_unit;
- req->rqh.cmd = (BYTE) (DVRQ_SEEK);
- req->rqh.status = 0;
-
- req->addrmd = mode;
- req->start = start;
- req->zero = (DWORD) 0;
- req->nsects = 0;
- cwRequests++;
- send_req((ReadWriteL_Hdr far *) req, drv->dev_addr);
- return (req->rqh.status); // Return Error Status
- }
-
-
- /*
- ** Play Request
- */
-
- WORD WDvRqPlay(drv,start,num,mode)
- Dev_List *drv;
- DWORD start;
- DWORD num;
- BYTE mode;
- {
- PlayReq_Hdr Play_Rec;
- register PlayReq_Hdr far *req = &Play_Rec;
- #ifdef TESTDRV
- extern WORD cwRequests;
- cwRequests++;
- #endif
-
- req->rqh.len = sizeof(PlayReq_Hdr);
- req->rqh.unit = drv->sub_unit;
- req->rqh.cmd = (BYTE) (DVRQ_PLAY);
- req->rqh.status = 0;
-
- req->addrmd = mode;
- req->start = start;
- req->num = num;
-
- send_req((ReadWriteL_Hdr far *) req, drv->dev_addr);
- return (req->rqh.status); // Return Error Status
- }
-
- /*
- ** Simple Request:
- ** Differs only by the command field in the Request Header
- */
-
- WORD WDvRqSimple(drv,cmd)
- Dev_List *drv;
- BYTE cmd;
- {
- Request_Hdr Request_Rec;
- register Request_Hdr *req = &Request_Rec;
- #ifdef TESTDRV
- extern WORD cwRequests;
- cwRequests++;
- #endif
-
- req->len = sizeof(Request_Hdr);
- req->unit = drv->sub_unit;
- req->cmd = (BYTE)(cmd);
- req->status = 0;
- cwRequests++;
- send_req((ReadWriteL_Hdr far *) req, drv->dev_addr);
- return (req->status);
- }
-
-
- /* ioctl() -
- **
- ** DESCRIPTION
- ** Sends an IOCTL request to the device driver in drv. The
- ** ioctl command is cmd and the ioctl cmd length is cmdlen.
- ** The buffer for the command is pointed to by xbuf.
- ** Returns the status word
- */
-
-
- WORD ioctl(drv, xbuf, iocmd, cmd, cmdlen)
- Dev_List *drv;
- BYTE *xbuf;
- BYTE iocmd;
- BYTE cmd;
- BYTE cmdlen;
- {
- Ioctl_Hdr Ioctl_Rec;
- register Ioctl_Hdr *io = &Ioctl_Rec;
- #ifdef TESTDRV
- extern WORD cwRequests;
- cwRequests++;
- #endif
-
- io->rqh.len = sizeof(Ioctl_Hdr);
- io->rqh.unit = drv->sub_unit;
- io->rqh.cmd = iocmd;
- io->rqh.status = 0;
-
- io->media = 0;
- io->xfer = (char far *) xbuf;
- *xbuf = cmd; // First byte of Control Block determines sub command
- io->nbytes = cmdlen;
- io->sector = 0;
- io->valid = 0;
-
- send_req((ReadWriteL_Hdr far *) io, drv->dev_addr);
- return (io->rqh.status);
-
- }